package hugotrabalho;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Essa classe é responsável por carregar e salvar
 * os arquivos de texto. Devido ao programa só carregar
 * um arquivo por vez o CarregadorArquivo é single instance.
 *
 */
public class CarregadorArquivo {

	/*
	 * Singleton
	 */
	private static CarregadorArquivo carregadorArquivo;
	static {
		carregadorArquivo = new CarregadorArquivo();
	}

	public static CarregadorArquivo getInstance() {
		return carregadorArquivo;
	}

	/**
	 * Carrega o arquivo no FileLoader.
	 * Caso algum arquivo esteja aberto pelo
	 * FileLoader o mesmo será descarregado (fechado)
	 *
	 * @param file
	 */
	public void carregar(File file) throws IOException {
		if(file == null) {
			throw new RuntimeException("O arquivo (File), não pode ser nulo");
		}
                if(!file.exists()) {
                    file.createNewFile();
                }
		this.file = file;
	}

	// fields
	private File file;

	/**
	 * Construtor default private
	 *
	 * @param file
	 */
	private CarregadorArquivo() {

	}


	/**
	 *
	 *
	 * @return true se o arquivo é novo
	 * (ainda não foi salvo) false caso contrário
	 */
	public boolean isArquivoNovo() {
		return !this.file.exists();
	}

	/**
	 * @return String com o conteúdo do arquivo de
	 * texto carregado null se o arquivo não existir
	 *
	 * @throws IOException
	 */
	public String getConteudo() throws IOException {

		String result = "";
		/* Retorna null se o arquivo não existe */
		if(!this.file.exists()) {
			return null;
		}

		FileReader fileReader = new FileReader(this.file);
		BufferedReader bufferedReader = new BufferedReader(fileReader);

		String linha = null;
		while( (linha = bufferedReader.readLine()) != null ) {
			result += linha+"\n";
		}

		bufferedReader.close();
		fileReader.close();

		return result;
	}

	/**
	 * Salva o arquivo (atualiza se o arquivo já
	 * existe), cria um novo com e salva acaso
	 * contrário
	 *
	 * @throws IOException
	 */
	public void salvarArquivo(String conteudo) throws IOException {

		if(!this.file.exists()) {
			this.file.createNewFile();
		}

		FileWriter fileWriter = new FileWriter(this.file);
		BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

		bufferedWriter.write(conteudo);
		bufferedWriter.close();

		fileWriter.close();
	}

	/**
	 * Fecha o arquivo caso algum esteja carregado
	 *
	 */
	public void fecharArquivo() {
		this.file = null;
	}

	/**
	 * Verifica se há algum arquivo carregado
	 * pelo FileLoader
	 *
	 * @return true se o file loader está fechado
	 * (sem nenhum arquivo carregado)
	 */
	public boolean isFechado() {
		return this.file == null;
	}

	public File getArquivoAtual() {
		return this.file;
	}

}
